package com.djinfo.work.common.dao;

import org.hibernate.*;
import org.hibernate.transform.Transformers;
import org.springframework.orm.hibernate4.HibernateTemplate;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;

/**
 * 整合后的BASEDAO
 * @author ChenShun
 *
 */
@SuppressWarnings("rawtypes")
public interface BaseDao {


	/**
	 * 保存
	 * @param entity
	 */
	public void save(Serializable entity, boolean autoCommit);

	/**
	 * 保存
	 * @param entity
	 */
	public void savetwo(Serializable entity);
	/**
	 * 保存
	 * @param entity
	 */
	public void save(Serializable entity);
	/**
	 * 保存
	 * @param entity
	 */
	public void update(Serializable entity);
	/**
	 * 保存
	 */
	public int updateSql(String hql, Object... objects);
	/**
	 * 删除
	 * @param entity
	 */
	public void delete(Serializable entity) ;
	/**
	 * 根据HQL进行批量update与delete
	 * @param hql
	 * @param objects
	 * @return
	 */
	public int updateByHQL(String hql, Object... objects) ;



	/**
	 * 根据HQL查询单个对象
	 *
	 * @param hql
	 * @param objects
	 * @return
	 */
	public Object getUniqueObject(String hql, Object... objects) ;
	/**
	 * 根据sql查询单个对象
	 *
	 * @param hql
	 * @param objects
	 * @return
	 */
	public Object getUniqueObjectSql(String hql,Class clz, Object... objects) ;
	/**
	 * 根据HQL查询单个对象
	 *
	 * @param hql
	 * @param objects
	 * @return
	 */
	public Object getUniqueObjectOne(String hql, Object... objects) ;
	/**
	 * 根据HQL进行查询
	 *
	 * @param hql
	 * @param objects
	 * @return
	 */
	public List getList(String hql,Object... objects) ;

	/**
	 * 根据sql进行查询
	 *
	 * @param hql
	 * @param objects
	 * @return
	 */
	public List getListSql(String hql,Class clz,
						Object... objects) ;
	/**
	 * 根据HQL进行查询
	 *
	 * @param hql
	 * @param objects
	 * @return
	 */
	public List getListMax(String hql,
						   Object... objects) ;
	/**
	 * 根据HQL进行分页查询
	 *
	 * @param hql
	 * @param pageNum
	 * @param pageSize
	 * @param objects
	 * @return
	 */
	public List pageQuery(String hql, Integer pageNum, Integer pageSize,
						  Object... objects) ;

	/**
	 * 根据HQL进行分页查询
	 *
	 * @param pageNum
	 * @param pageSize
	 * @param objects
	 * @return
	 */
	public List pageQueryBySQL(String sql, Integer pageNum, Integer pageSize,
							   Object... objects);
	/**
	 * 根据HQL进行分页查询
	 *
	 * @param pageNum
	 * @param pageSize
	 * @param objects
	 * @return
	 */
	public List pageQuerySQL(String sql, Integer pageNum, Integer pageSize,
							   Object... objects) ;

	/**
	 * 根据HQL进行分页查询
	 *
	 * @param hql
	 * @param pageNum
	 * @param pageSize
	 * @param objects
	 * @return
	 */
	public List page(String hql, Integer pageNum, Integer pageSize,
					 Object... objects) ;

	/**
	 *
	 * @param hql
	 * @param list
     * @return
     */
	public List getList(String hql,List<String> list);


	/**
	 * for循环
	 * @param list
	 * @return
	 */
	public Integer []  getforInteger(List list);


	/**
	 * 通过主键获取记录
	 * @param object
	 * @param pkID
	 * @return
	 */
	public Object getByPrimaryKey(Class object, String pkID);

	public <T> T getEntity(Class entityName, Serializable id) ;

	public <T> List<T> loadAll(final Class<T> entityClass) ;
	//批量插入
	public <T> void saveList(List<T> list);

	public <T> T findUniqueByProperty(Class<T> entityClass,String propertyName, Object value);

	public <T> List<T> findByProperty(Class<T> entityClass,String propertyName, Object value);



}
